<template>
  <div class="image-container">
     <el-card class="box-card">
        <div slot="header" class="clearfix">
            <!-- 面包屑导航 -->
            <my-breadcrumb>素材管理</my-breadcrumb>
        </div>
        <div style="padding-bottom: 20px;">
          <el-radio-group v-model="collect" @change="hCollectChange">
            <el-radio-button label="false">全部</el-radio-button>
            <el-radio-button label="true">收藏</el-radio-button>
          </el-radio-group>
          <el-button type="success" style="float:right" @click="dialogVisible=true" size="mini">上传图片素材</el-button>
        </div>
        <!-- 图片列表 -->
        <el-row :gutter="10">
            <el-col
            v-for="(image,idx) in images" :key="image.id"
            class="img_item" :xs="12" :sm="6" :md="6" :lg="4">
              <el-image
              style="height: 180px;width: 180px"
              :src="image.url"
              fit="cover"
              ></el-image>
            <div class="option" v-show="!collect">
                <!-- 是否收藏 -->
              <span
               :style="{color:image.is_collected ? 'red' : '#fff'}"
               @click="hSwichCollect(image)"
               class="el-icon-star-off"></span>
              <span @click="hDelete(image.id,idx)" class="el-icon-delete"></span>
            </div>
            </el-col>
        </el-row>
        <!-- 分页 -->
        <el-pagination
          style="margin-top:10px"
          :hide-on-single-page="true"
          @current-change="hPageChange"
          background
          layout="prev, pager, next"
          :page-size="per_page"
          :total="total_count">
        </el-pagination>
     </el-card>
     <!-- 上传图片对话框 --><!-- :on-success="handleAvatarSuccess" -->
     <el-dialog
        title="提示"
        :append-to-body="true"
        :visible.sync="dialogVisible">
        <el-upload
          class="avatar-uploader"
          action="http://ttapi.research.itcast.cn/mp/v1_0/user/images"
          :headers="headers"
          name="image"
          :on-success="hUploadSuccess"
          :show-file-list="false"
          :before-upload="beforeAvatarUpload">
          <!-- 如果当前有预览地址就说明图片上传成功了 -->
          <el-image @load="hLoadImgOk" v-if="imgSrc" :src="imgSrc" class="avatar"></el-image>
          <i v-else class="el-icon-plus avatar-uploader-icon"></i>
        </el-upload>
        <span>上传图片</span>
      </el-dialog>
  </div>
</template>

<script>
import MyBreadcrumb from '../../components/MyBreadcrumb.vue'
import { getImages, swichCollect, deleteImage } from '../../api/image'
import { getUser } from '@/utils/storage.js'
export default {
  name: 'ImageIndex',
  components: {
    MyBreadcrumb
  },
  props: {},
  data () {
    return {
      images: [],
      per_page: 10, // 每页张数
      cur_page: 1, // 当前页码
      total_count: 0, // 本次查询结果总数
      collect: false, // 是否是收藏图片
      dialogVisible: false, // 是否显示对话框
      // 由于这里的上传不是走的axios,而处理上传的接口又需要token
      // 所以这里只能手动添加token
      headers: {
        Authorization: `Bearer ${getUser().token}`
      },
      imgSrc: null
    }
  },
  computed: {},
  created () {
    this.loadImages()
  },
  methods: {
    async loadImages () {
    //   getImages().then(res => {
    //     console.log(res)
    //   })
      try {
        const res = await getImages({
          per_page: this.per_page,
          page: this.cur_page,
          collect: this.collect
        })
        this.images = res.data.data.results // 保存当前查询结果
        this.total_count = res.data.data.total_count // 更新查询总结果数
      } catch (err) {
        console.log(err)
      }
    },
    hPageChange (curPage) {
      // alert(curPage)
      this.cur_page = curPage
      // 再发请求
      this.loadImages()
    },
    hCollectChange () {
      // 全部、收藏的切换
      // console.log(this.collect)
      this.loadImages()
    },
    hUploadSuccess (res) {
      // console.log(res)
      // 保存上传图片成功之后地址
      this.imgSrc = res.data.url
      this.$message.success('素材上传成功')
      this.loadImages()
    },
    hLoadImgOk () {
      // alert('OKimg')
      setTimeout(() => {
        this.dialogVisible = false
        this.imgSrc = null
      }, 2500)
    },
    // 切换收藏
    async hSwichCollect (image) {
      // alert('sc')
      const { id, is_collected } = image
      try {
      // 是否收藏：在原来的基础上取反
      // (图片id，是否收藏)
        await swichCollect(id, !is_collected)
        this.$message.success('操作成功')
        // 方案1. 整个更新数据，就是重新请求。 成本高，不划算
        // this.loadImages()
        // 方案2. 只更新当前这个图片的数据项。
        // image是一个对象，就是当前被点击那张图片。你改了这些的数据，则images中的数据也改了
        // 则视图也会更新
        image.is_collected = !is_collected
      } catch {
        this.$message.error('操作失败')
      }
    },
    // 删除图片
    hDelete (id, idx) {
      // 删除之前，要做提示
      this.$confirm('删除!?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(async () => {
        try {
          await deleteImage(id)
          this.$message.success('删除成功')
          // 有两种方案：
          // 方案1. 整个更新数据，就是重新请求。 成本高，不划算。
          // this.loadImages()
          // 方案2. 只更新当前的数据 在images中删除这一项。
          // id: 要删除的图片编号
          // idx就是这一项在当前数据项images中的位置（索引值）,直接删除它
          this.images.splice(idx, 1)
        } catch {
          this.$message.error('删除失败')
        }
      }).catch(() => {
        // 用户取消了
      })
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('上传图片只能是 JPG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('上传图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    }
  }
}
</script>
<style lang="less" scoped>
  .img_item {
    position: relative;
    box-sizing: border-box;
  }
  .option {
    position: absolute;
    left: 5px;
    right:5px;
    bottom: 5px;
    height: 30px;
    line-height: 30px;
    background: rgba(0, 0, 0, 0.3);
    text-align: center;
    color: #fff;
    span {
      margin: 0 30px;
      cursor: pointer;
    }
  }
  // 上传图片
.avatar {
   width: 178px;
   height: 178px
}
.avatar-uploader {
    text-align: center;
}
.avatar-uploader-icon {
    font-size: 28px;
    color: #8c939d;
    width: 178px;
    height: 178px;
    line-height: 178px;
    text-align: center;
}
.avatar-uploader /deep/ .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
}
</style>
